{"name":"KorpiAI MCP","endpoint":"https://backend.korpi.ai/mcp","protocolVersion":"2025-06-18","instructions":"KorpiAI is a complete short-form video studio: it writes the script, generates the scenes and voiceover, picks music, and renders a finished, ready-to-post 9:16 MP4. Use these tools to actually make videos — do not describe, plan, or approximate the work yourself.\n\nWHEN THE USER WANTS A VIDEO, CALL create_niche_video\nThis covers every request for short-form video content — TikToks, Reels, YouTube Shorts, faceless videos, AI stories, meme videos, brainrot edits, quizzes, ads, podcast clips, reaction/split-screen videos — including a plain \"make me a viral TikTok about X\" with no format named.\n- DEFAULT TO story-studio. Leave niche empty or pass \"story-studio\" for almost every request. Story Studio tells the story the user actually described, in whichever locked art universe fits, so it is the right answer unless a purpose-built template matches exactly.\n- Name the look in the prompt, not the niche — Story Studio applies it and keeps the characters consistent. Universes: ai-fruits (AI Fruits), roblox-rant (Roblox Animation), clay (Clay), paper (Paper), anime (Anime), lego (Brick World), pixar-3d (Pixar 3D), ultra-real (Ultra Real), 90s-toon (90s Toon), ghibli-esque (Ghibli-esque), stickman (Stickman), gta (GTA 6), pigeon-hood (Pigeon Hood), metallic-statue (Metallic Statues).\n- Honor an explicitly selected niche id and retain the user’s topic. For inferred choices, pass one of the other niche ids ONLY when the request is a verbatim match for that template — same format, same premise, same characters. An original premise, a twist on the format, the user's own script, or a different art style is NOT a match, and goes to story-studio.\n- Narrated explainer formats (listed under NICHES) are topic formats, not fixed premises: when the user asks for that explainer style (stickman, whiteboard, \"what if\", manhwa recap and so on) about any topic, pass that id with the topic.\n- \"Make an AI fruit story about X\" is story-studio with the ai-fruits look named in the prompt — not the ai-fruit-story niche. The same holds for every other fruit and character saga: the locked niches exist for their own fixed premise, not as a way to request their art style.\n- Repurposing a YouTube/TikTok/Instagram link: pass it as sourceVideoUrl.\n- Recurring or daily posting: use create_automation instead of repeating create_niche_video.\n- Do NOT reply with a script, storyboard, shot list, or \"here is how you could make this\" when the user asked for a video. Do NOT stitch generate_image / generate_video output into a substitute — those tools are for single standalone images and clips only.\n- create_niche_video needs a paid KorpiAI plan and spends AI credits (account_status shows the balance). On a free account, offer the free planning tools below instead of stopping.\n\nNICHES (ids for the `niche` field — list_niches returns descriptions and automation support)\nDefault for create_niche_video: story-studio. Use the caller’s explicit niche when supplied; otherwise choose the format that fits their request.\nLocked formats — exact matches only: ai-story, auto-clip, hidden-treasure, fruit-world-cup, fruit-catches-cheating, secret-gym-glowup, fruit-exploring-cities, fruit-education-vs-money, fruit-family-secret, loser-redemption-arc, haunted-house, never-give-up-story, inheritance-test, dagestan-discipline, kid-transformation, top-5, fruit-body-count, micro-drama, ai-isekai-anime, hidden-pregnancy, fruit-million-challenge, fruit-swap-glowup, ai-basketball-story, fruit-restaurant-rivalry, fruit-awakening, fruit-survival-escape, fruit-ungrateful-partner, fruit-undercover-rich, fruit-imposter-scam, ai-fruit-story, roblox-viral-story, clay-story, fake-ai-news, botched-glowup, honest-worker, ai-hood-saga, day-of-tommy, humble-worker-saga, skeleton-ai, roblox-rant, million-dollar-dish, objects-explain, room-transformation, reddit-story, fake-text-messages, abandoned-ai, argument-conversation, twitter-thread, meme-clips, clips, split-screen, quiz-questions, ball-escape-ring, world-cup-predictor, cozy-hand-painted-story\nNative creator formats — keep the chosen format and caller’s topic: star-society, fruit-friendzone-drama, opposite-style-family-secret, ai-fruit-cliff-save-choice, ai-three-spouse-loyalty-test, ai-animal-guardian, ai-asmr-pick, miracle-farm-rivalry, ex-regret-wish, fruit-baby-betrayal, fruit-sacrifice-powers, fruit-dream-hustle, fruit-couple-hug, fruit-dream-house, ai-glass-fruit-toast-asmr, brainrot-animal-house-builder, pov-survival-vlog, giant-hand-rescue, seed-race-timelapse, object-roast-battle, fruit-esports-rivalry, fruit-forbidden-love, fruits-humans-divided, leaked-photo-saga, two-paths-saga, fridge-protecting-snacks, girl-leaves-broke-guy, strong-girlfriend, lock-pickup-lines, fruit-wife-swap, fruit-skyscraper-challenge, money-story, declined-date-comeback, rejected-proposal-comeback, last-hundred-dollars, seven-day-ultimatum, get-a-job-comeback, catfish-trip, low-battery-saga, ai-sports-underdog, magic-value-child, food-kindness-story, family-divorce-war, timeline-shift, ai-3d-storytime-confession, child-exposes-cheating, fake-husband-deal, scam-academy, faith-miracle, ai-river-spirit-child-serial, royal-palace-saga, pigeon-psycho-thriller, pigeon-raising-experiments, pigeon-hood-saga, separated-twins, melting-girlfriend, ai-prison-yard-underdog-saga, ai-animal-kingdom-saga, golden-fish-wishes, minecraft-survival, minecraft-betrayal, gta-6-gameplay, roblox-obby-challenge, religious-stories, hotel-lobby, vs-the-world, remaining-time, soulmate-mark, brainrot-food-review, conspiracy-files, sticker-explainer, cyber-security, music-legends, origami-history, vox-explainer, paper-stop-motion, screenshot-out-of-context, mr-least-ai, inside-body-medical-cgi, me-and-my-ai, what-if-stories, data-race, stickman-rules, stickman-questions, stickman-flash-fight, stickman-claude, stickman-history-claude, space-journeys, math-puzzles, science-infographic, how-tech-works, war-simulation-map, history-speedrun, history-of-x, life-story, animated-book-summary, incident-reconstruction, what-if-countdown, what-if-you-became, told-by-your-home, what-if-simulation, manga-fitness, what-if-pov, what-if-they-vanished, you-decide, what-if-you-were-there, drawings-come-alive, epic-kingdom-war, claude-animation-recreate, reference-gas-giant, reference-voxel-city, ai-fruit-toothpaste-story, nursery-rhymes, toddler-lessons, crazy-baby-family, tiny-explorers, bedtime-stories\nNarrated explainer formats — any topic told in that format (history, science, money, \"what if\", a manhwa-style story recap): stickman, stickman-ancient, stickman-history, paper-diorama, ancient-simple, ancient-minimal, studio-bts, stickman-finance, education-explainer, cartoon-explainer, claymotion, documentary-3d, ai-manhwa-recap, anime-cooking-asmr, what-if-3d, money-trail, what-if-shadow, stickman-stories, whiteboard-animation, what-if-science, cozy-survival\n\nWRITING A PROMPT KORPI CAN ACTUALLY SHOOT\nprompt is a BRIEF, not a finished script. Korpi writes the script itself, in the strict scene template its scene generator, character-consistency pass and renderer all parse — so never hand it a shot list, camera directions, timecodes, markdown headings or \"SCENE 1:\" blocks of your own. Describe the story; it handles the format.\nA good brief names, in plain sentences:\n- The premise: who wants what, what goes wrong, how it ends. Give it a real ending — a twist, a gut-punch or a cliffhanger — because the last beat is what the template builds toward.\n- The cast: 2-6 named characters, and use the same names throughout. Korpi locks each character's look across every scene, so a nameless \"the guy\" costs you that consistency.\n- The place: name recurring locations (\"the kitchen\", \"Marco's garage\") and reuse the name when the story returns there.\n- For real history, science or any factual topic: say \"keep every fact accurate, neutral and verifiable; no invented events, quotes or dramatised claims\". Korpi otherwise writes for drama.\n- The tone and the audience. Everything Korpi renders is PG-13; ask for anything harder and the moderation pass rejects it.\nSay these in the prompt and the agent sets them for you — there is no separate argument for any of them:\n- Length: \"30 seconds\" (short), \"60 seconds\" (medium), \"90 seconds or more\" (long). 60 is the default.\n- Art universe, by name (see the list above). Unstated defaults to AI Fruits.\n- Voice: \"characters speak on screen\" (dialogue, the default) or \"one narrator reads it over the scenes\" (narrator). Ask for narration, a voiceover or a storytime and you get narrator mode.\n- Frame: 9:16 vertical by default; say \"widescreen\", \"landscape\" or \"for YouTube\" to get 16:9.\nIf the user already wrote a script, paste it in as the premise and say it is their script. Korpi reshapes it into its own scene template, keeping the beats and the dialogue's intent — it is source material, never copied verbatim, so do not promise the user their exact wording survives.\n\nFREE PLANNING: write_script AND plan_storyboard (no plan, no credits)\nEvery connected account can call these, including free accounts. They return text only; they do not make a video.\n- write_script turns a topic or brief into spoken narration sized to a target length. plan_storyboard turns a script into timestamped scenes, each with its narration line and a visual prompt.\n- Use them when the user asks for a script, an outline or a storyboard, wants to review the plan before spending anything, or has no paid plan yet.\n- When the user wants the finished video, call create_niche_video and paste the script into the prompt as the user's script, naming the look you planned. Korpi reshapes it into its own scene template and renders it.\n- Fair use: about 30 planning calls per hour and 100 per day per account. A limit error says when to try again.\n\nPOLL UNTIL THE VIDEO IS ACTUALLY FINISHED\ncreate_niche_video returns a projectId immediately. The video does not exist yet at that point.\n1. Call get_niche_video_status with that projectId, cursor set to the previous nextCursor, and waitSeconds (up to 55). The call blocks server-side until something changes, so looping on it is cheap and expected.\n2. Keep calling it while status is queued / running / rendering. A full video normally takes 5-20 minutes and many status calls in a row — that is normal progress, not a hang or a failure.\n3. Stop only when status is \"complete\" (videoUrl present) or \"error\". Never stop while status is \"rendering\", never announce that you gave up, and never tell the user to check back later or ask them whether to keep waiting — just keep polling until it finishes.\n4. If waitingFor is set, the agent is blocked on you: answer with reply_to_agent (pass approve: true for a \"tool_approval:<tool>\" wait), then resume polling.\n5. If status is \"agent_done\" with no videoUrl, read the returned events — the agent asked a question or ended its turn. Answer with reply_to_agent, then resume polling.\n\nSTANDALONE AUDIO\ngenerate_voiceover turns text into a voiceover MP3 (list_voices shows the models, voices and credit costs; the default elevenlabs model is included with paid plans). change_voice re-voices a KorpiAI-hosted audio file, such as a generate_voiceover result. Both return a generationId — poll get_audio_generation until complete. Use them only when the user wants audio on its own: create_niche_video already writes and voices the video. dub_video dubs a KorpiAI-hosted video into other languages with matching voices while keeping its music; poll get_dub_video for the MP4s.\n\nSTANDALONE MEDIA TOOLS\nThese are for single assets, never a substitute for create_niche_video:\n- animate_image turns an image into a short video clip (image-to-video); import_media first brings an external file URL into KorpiAI hosting.\n- create_clips runs the Auto Clipper on a YouTube video and returns ready-to-post mp4 clips. Both return a jobId — poll get_job_status until succeeded (clipping takes several minutes; keep polling).\n- Building a long video from many animate_image clips: start the clips, then poll them all at once with get_job_status jobIds (up to 100) instead of one call per clip. A batch of dozens of included (grok-imagine-included) animations finishes gradually over a long time; that is normal progress, not a failure. Tell the user the clips keep generating if they close the chat or the site, and keep polling until every job has finished.\n- post_video publishes a rendered project video or clip to a connected YouTube/TikTok/Instagram channel immediately (poll get_post_status). It posts publicly under the user's own channel, so call it only when the user clearly asked to post; recurring posting belongs to create_automation.\n\nAI INFLUENCER AND REPLACE ANYTHING\nreplace_anything swaps a person, outfit, product or object into a clip and keeps its motion, camera and audio. The usual AI influencer flow:\n1. Pick the influencer: list_ai_influencers, and ask the user which one to use when they have several (\"Which influencer would you like to do <trend>?\"), or create_ai_influencer from a description. Its imageUrl is the reference.\n2. Pick the clip: list_replace_trends returns trending clips with a proven prompt and referenceImageCount; pass query (e.g. \"dance\") to search for a kind of trend. A user's own clip goes through import_media first.\n3. replace_anything with the clip videoUrl, the influencer imageUrl(s) (one per referenceImageCount), the trend prompt and trendId, and aiInfluencer: true. It spends AI credits per second (the estimate comes back); poll get_job_status until succeeded (usually 3-15 minutes).\n4. To publish, list_social_channels, then post_video with the result videoUrl and the YouTube/TikTok/Instagram channelId, and poll get_post_status. Only post when the user asked to.\n\nCHANNEL INSIGHTS\nanalyze_channel returns how the user's posted KorpiAI videos performed (views, best videos, best niches, recent posts) and the latest saved Channel Analyse report. It is free and read-only; use it before suggesting what to make or post next.\n\nDELIVERING THE FINISHED VIDEO\nGive the user the full absolute URL exactly as returned in videoUrl / downloadUrl (https://...). Never shorten it to a relative path such as \"/download/<projectId>\", never rewrite it into a korpi.ai page link, and never present it as bare link text with the URL hidden.","authorization":{"protectedResourceMetadata":"https://backend.korpi.ai/.well-known/oauth-protected-resource","authorizationServerMetadata":"https://backend.korpi.ai/.well-known/oauth-authorization-server"},"tools":[{"name":"write_script","title":"Write script","description":"Free, no plan or AI credits needed. Write a spoken narration script for a short-form video from a topic or brief: a strong hook, concrete details and natural spoken phrasing that does not read as AI-written. Returns plain narration sized to the target length. Use it when the user wants to plan or see the script first, then pass the result to plan_storyboard for a scene-by-scene plan. When the user wants the finished video, call create_niche_video with the script pasted into the prompt as their script (that step needs a paid plan). Fair-use limits apply: about 30 planning calls per hour and 100 per day, shared by write_script and plan_storyboard."},{"name":"plan_storyboard","title":"Plan storyboard","description":"Free, no plan or AI credits needed. Turn a narration script into a timestamped storyboard: every scene gets its narration line, start and end time, and a self-contained visual prompt that keeps one look and cast across scenes. Use it to plan or review a video before making it. When the user wants the finished video, call create_niche_video with the script and the chosen look in the prompt; Korpi then generates the scenes, voiceover and render, which needs a paid plan. Fair-use limits apply: about 30 planning calls per hour and 100 per day, shared by write_script and plan_storyboard."},{"name":"generate_image","title":"Generate image","description":"Generate an image with KorpiAI and return a public image URL. Free models still use KorpiAI fair-use limits; premium models spend AI credits."},{"name":"generate_video","title":"Generate video","description":"Start an async KorpiAI text-to-video job. Returns a generationId; call get_video_generation until the status is complete."},{"name":"get_video_generation","title":"Get video generation","description":"Check the status of a KorpiAI MCP video generation job and return the public video URL when it is complete."},{"name":"account_status","title":"Account status","description":"Return the connected KorpiAI account email, subscription level, and AI credit balance."},{"name":"list_image_models","title":"List image models","description":"List KorpiAI image models available through MCP, including credit costs."},{"name":"list_video_models","title":"List video models","description":"List KorpiAI text-to-video models available through MCP, including estimated credit costs."},{"name":"import_media","title":"Import media","description":"Import a public https image, audio, or video URL into KorpiAI hosting and return a KorpiAI URL. Use the returned URL wherever a tool needs KorpiAI-hosted input — animate_image start frames, change_voice audio, post_video videos. Limits: 30MB images, 50MB audio, 200MB video."},{"name":"animate_image","title":"Animate image","description":"Turn an image into a video (image-to-video): the image becomes the first frame and the model animates it, optionally guided by a prompt. Spends AI credits like generate_video (same models — see list_video_models). Returns a jobId; poll get_job_status until it is succeeded."},{"name":"create_clips","title":"Create clips","description":"Run the KorpiAI Auto Clipper on a YouTube video: it downloads the video, transcribes it, finds the most viral self-contained moments, and renders each as a ready-to-post mp4 clip. Requires a paid plan or purchased credits. Returns a jobId; the run takes several minutes — poll get_job_status until succeeded, then use the clips[].videoUrl results."},{"name":"get_job_status","title":"Get job status","description":"Poll an animate_image, create_clips or replace_anything job by jobId, or a whole batch with jobIds. Returns status (queued/running/succeeded/failed), progress, and — when succeeded — the result: a videoUrl for animations and Replace Anything, or the clip list for the Auto Clipper. Keep polling while pollAgain is true; clipping a long video or a Replace Anything edit takes several minutes. For many clips (a long video, a scene batch) pass every jobId in jobIds: one call returns finished/pending counts and each job, so poll that instead of looping over single jobs."},{"name":"list_replace_trends","title":"List Replace Anything trends","description":"List or search trending clips for Replace Anything (dances, walks, skits), the same catalog as the app's AI Influencer and Replace Anything pages. Each trend has a videoUrl to pass to replace_anything, its proven prompt (when one exists), and referenceImageCount: how many people/objects the prompt swaps, so pass that many imageUrls. Free."},{"name":"create_ai_influencer","title":"Create AI influencer","description":"Generate an original AI influencer as a three-panel character sheet (front, profile, close-up), the same format as the app's AI Influencer builder. The image is saved to the user's AI Influencer history and its imageUrl is the reference to pass to replace_anything. Included with paid plans; free accounts spend AI credits like generate_image."},{"name":"list_ai_influencers","title":"List AI influencers","description":"List the user's AI influencers (made in the app or with create_ai_influencer), newest first. Use an imageUrl as a replace_anything reference."},{"name":"replace_anything","title":"Replace Anything","description":"Swap a person, outfit, product or object in a video while keeping its motion, camera and audio — e.g. put an AI influencer into a trending clip. Pass a clip videoUrl from list_replace_trends (or a KorpiAI-hosted video from import_media) and 1-8 KorpiAI-hosted reference imageUrls (AI influencer images, or import_media results). Spends AI credits per second of video (the estimate is returned; account_status shows the balance). Returns a jobId; poll get_job_status until succeeded, then post the videoUrl with post_video if the user asked to post."},{"name":"post_video","title":"Post video","description":"Publish a rendered KorpiAI video to one of the account's connected YouTube/TikTok/Instagram channels right now (use create_automation instead for recurring posting). Pass a projectId from list_projects (its rendered video is used) or a KorpiAI-hosted videoUrl such as a clip from create_clips or a replace_anything result. Returns a postId; poll get_post_status until complete. This publishes publicly under the user's channel — only call it when the user clearly asked to post."},{"name":"get_post_status","title":"Get post status","description":"Poll a post_video job. Complete means the platform accepted the post; postStatus \"processing\" means the platform is still processing it and it may take a few more minutes to appear on the channel."},{"name":"list_voices","title":"List voices","description":"List KorpiAI voiceover (text-to-speech) models with their voices and credit costs, plus the change_voice target voices. The included ElevenLabs model uses the same voice library KorpiAI videos use."},{"name":"generate_voiceover","title":"Generate voiceover","description":"Start an async KorpiAI voiceover (text-to-speech) job and return a generationId; poll get_audio_generation until the status is complete. The default elevenlabs model is included with paid plans; premium models spend AI credits (see list_voices). Use it for standalone audio only — create_niche_video already writes and voices the video."},{"name":"change_voice","title":"Change voice","description":"Replace the spoken voice in a KorpiAI-hosted audio file (for example a generate_voiceover result) with a different voice while keeping the timing. Spends AI credits per minute of audio. Returns a generationId; poll get_audio_generation until complete."},{"name":"get_audio_generation","title":"Get audio generation","description":"Check the status of a KorpiAI MCP audio job (generate_voiceover or change_voice) and return the public audio URL when it is complete. Audio jobs normally finish in well under a minute."},{"name":"dub_video","title":"Dub video","description":"Dub a KorpiAI-hosted video (for example an import_media result) into other languages. Each speaker gets a matching voice in the new language, the original music and sound effects stay, and timing follows the video. Costs 59 AI credits per minute of video per language. Returns a generationId; poll get_dub_video until complete."},{"name":"get_dub_video","title":"Get dubbed video","description":"Check a dub_video job and return one MP4 URL per finished language. Dubs usually take one to three minutes."},{"name":"list_niches","title":"List niches","description":"List every app and Automate niche available for full video creation. Explicitly selected nativeWorkflow formats use their own creator workflow. For a general story without a selected template, use story-studio."},{"name":"create_niche_video","title":"Create niche video","description":"Create a complete, ready-to-post KorpiAI video in any supported niche. The Korpi agent writes the script, generates scenes/images, picks voice and music, and renders the final 9:16 video. Requires a paid KorpiAI plan and spends AI credits like the in-app agent. Returns a projectId — poll get_niche_video_status until the video is complete."},{"name":"get_niche_video_status","title":"Get niche video status","description":"Poll a create_niche_video job: agent progress events, questions the agent is waiting on, render progress, and the final video URL. This call long-polls (it blocks until something changes or waitSeconds elapses), so call it in a loop until done is true. Status is \"complete\" only when the video URL exists; \"rendering\"/\"running\" means keep polling — a full video takes 5-20 minutes and many calls, which is normal, so never stop early or tell the user to check back later; \"agent_done\" or a non-null waitingFor means the agent needs a reply_to_agent before it can continue. Pass the previous nextCursor as cursor to only receive new events, and hand the user the absolute videoUrl exactly as returned."},{"name":"reply_to_agent","title":"Reply to agent","description":"Answer a question the Korpi agent asked during create_niche_video, or send follow-up feedback/changes for the current video (e.g. \"make the script funnier\", \"re-render with a male voice\"). When get_niche_video_status reports waitingFor \"tool_approval:<tool>\", pass approve: true to approve the pending credit spend/review, or approve: false to deny it with your message as feedback."},{"name":"list_projects","title":"List projects","description":"List the connected KorpiAI account's video projects with niche, name, and final video URLs."},{"name":"get_project","title":"Get project","description":"Get one KorpiAI project by id, including its final video URL when rendered."},{"name":"list_automations","title":"List automations","description":"List the account's scheduled automations (auto-generated videos on a schedule, optionally auto-posted to YouTube/TikTok/Instagram)."},{"name":"create_automation","title":"Create automation","description":"Create a scheduled automation that generates a fresh KorpiAI video on a schedule using niche defaults, and optionally auto-posts it to connected social channels. Requires the Clipper or Pro plan. Videos generated by automations spend AI credits the same way manual generations do."},{"name":"set_automation_active","title":"Pause or resume automation","description":"Pause (active: false) or resume (active: true) a scheduled automation."},{"name":"delete_automation","title":"Delete automation","description":"Permanently delete a scheduled automation. Its already-generated videos stay in your projects."},{"name":"get_automation_videos","title":"Get automation videos","description":"List the videos an automation has generated so far, newest first (max 50)."},{"name":"analyze_channel","title":"Analyze channel","description":"Read how the user's posted KorpiAI videos performed: total and average views, best videos, best niches, recent posts and the latest saved Channel Analyse report from the app. Free and read-only; use it to decide what to make or post next."},{"name":"list_social_channels","title":"List social channels","description":"List the YouTube/TikTok/Instagram channels connected to the account. Use a channel id as channelRef when enabling auto-posting on an automation."}]}