OriginShorts MCP Server
Connect Claude, ChatGPT, Cursor or any MCP client to OriginShorts and make, edit and post faceless short-form videos from a conversation. Script, visuals, narration, captions and music, rendered to a finished MP4.
- Endpoint
- originshorts.com/mcp
- Transport
- Streamable HTTP
- Auth
- OAuth 2.1, or Bearer API key
Connecting
Two ways in. Marketplace clients use OAuth and need nothing from you but a login; everything else can carry an API key directly.
With OAuth
In ChatGPT, Claude or any client that supports remote MCP servers, add https://originshorts.com/mcp as a connector and approve the consent screen. The server registers clients dynamically, so there is no key to paste and nothing to configure.
Discovery and endpoints, if your client asks for them explicitly:
| Purpose | URL |
|---|---|
| Authorization server metadata | /.well-known/oauth-authorization-server |
| Protected resource metadata | /.well-known/oauth-protected-resource |
| Authorize | /oauth/authorize |
| Token | /oauth/token |
| Dynamic client registration | /oauth/register |
| Scope | videos |
With an API key
Create a key on your account page and send it as a bearer token. Keys start with os_live_ and carry the permissions of the account that made them.
Authorization: Bearer os_live_YOUR_KEY
Treat a key like a password: it can spend your credits. Keep it out of shared configs and source control.
Client configuration
Copy the block for your client. Replace os_live_YOUR_KEY with your own key, or drop the header entirely if you are connecting over OAuth.
Claude Code
claude mcp add originshorts --transport http https://originshorts.com/mcp \ --header "Authorization: Bearer os_live_YOUR_KEY"
Claude (web and desktop app)
Customize → Connectors → + Add → Add custom connector. Name it OriginShorts, paste https://originshorts.com/mcp, and sign in when asked (OAuth). No key required. On Team and Enterprise plans, an owner adds it first under Organization settings → Connectors.
Cursor
In ~/.cursor/mcp.json, or .cursor/mcp.json in a project:
{
"mcpServers": {
"originshorts": {
"url": "https://originshorts.com/mcp",
"headers": {
"Authorization": "Bearer os_live_YOUR_KEY"
}
}
}
}ChatGPT
Turn on Developer mode (Settings → Apps & Connectors → Advanced settings), then create a connector pointing at https://originshorts.com/mcp with OAuth and approve the sign-in screen. No key required. Needs a paid ChatGPT plan; on Business and Enterprise workspaces, an admin enables custom connectors first.
Workflow
Generation is asynchronous. One call starts it, then you poll. A video usually takes one to three minutes, a few more when animated.
- Create
Call create_video with a topic (we write the script) or a script of your own. It returns a video id straight away.
- Wait
Call get_video_status. It waits on our side for up to about 40 seconds and returns the moment the video is done, so an assistant just calls it again until it is. No pauses between calls. Status moves queued → processing → rendering → completed, with a plain-language stage and percent along the way.
- Download
On completion the response carries a download_url for the MP4. It is valid for one hour. Poll again for a fresh link.
If generation fails, the status becomes failed and its credits are refunded automatically. If only the MP4 render fails, the status is also failed, with failed_at: render: renders are free, so there is nothing to refund, and render_video tries again.
Free accounts: videos carry a small "Made with OriginShorts" mark and end with a 3.5-second OriginShorts outro.
Tools
Twenty-eight tools: six to make and track videos, seventeen to look at and edit them, five to post them. Every response is JSON except view_video, which returns the image itself; errors come back as readable text with the reason and what to do about it.
create_videowrites100+ creditsStarts a video. Provide exactly one of topic or script. Returns an id immediately. An identical retry a few seconds or minutes later normally returns the same video without a second charge (identical requests are matched within five-minute clock windows, so a retry that crosses one can make a second video). The parameters below are the complete list: videos render 9:16 with the default captions.
| Parameter | Type | Notes |
|---|---|---|
topic | string | Idea to write the script from. 3 to 1200 characters. one of topic | script |
script | string | Your narration, used verbatim. At least 10 and at most 1,200 characters. one of topic | script |
duration_range | enum | Target length in seconds. required |
voice | string | Voice id from list_voices. Voices marked premium add 30 credits. Free accounts use the voices with requires_plan false. |
voice_instructions | string | How the voice reads it: tone, accent, emotion, pace. Voices with supports_direction only. Max 300 characters. |
art_style | enum | A preset look for the images. Presets are preferred: they keep the style consistent from scene to scene. |
custom_art_style | string | Your own look in up to 60 characters, instead of art_style. Best kept for when a specific look is asked for. |
image_quality | enum | basic or pro. Pro adds 30 credits. |
animated | boolean | Animate the scenes as part of generation: every scene, up to 25 scenes or 150 seconds (a few minutes longer). Charged upfront; the animation part is refunded if most scenes fail. |
animation_quality | enum | With animated: basic (default) or pro, 3 or 12 credits per estimated second of animation: the narration estimate plus about half a second per scene, plus 15%, capped at 450 / 1,800 credits. The reply's credits_charged is exact. |
style | string | Content style preset id from get_video_options. |
background_music | string | auto (default) matches music to the script; none leaves it silent; or a track id from list_music. |
music_volume | number | 0.05 to 1 (default 0.1). |
get_video_statusread onlyWaits for one video by id, and for any queued edits or render: returns as soon as there is nothing left to wait for, or after about 40 seconds with its current stage and percent (call again right away). Once complete, it includes view_url (watch in a browser) and download_url (save the MP4). Sends MCP progress notifications while it waits, and never starts a render itself.
| Parameter | Type | Notes |
|---|---|---|
video_id | string | Id returned by create_video. required |
list_videosread onlyThe account's videos, 25 per page, newest first.
| Parameter | Type | Notes |
|---|---|---|
status | enum | Only videos in this status: queued processing ready_to_render rendering completed failed. |
cursor | string | next_cursor from the previous page. |
list_voicesread onlyEvery narration voice with its language, gender and premium surcharge (premium voices add 30 credits; voices with requires_plan need a paid plan; supports_direction voices take voice direction). Takes no parameters.
get_video_optionsread onlyEvery valid value for create_video (duration ranges, style presets, art styles, image quality, animation, background music), the editing choices and current credit pricing. Call this rather than hard-coding values. Takes no parameters.
get_credit_balanceread onlyCurrent balance and plan. Worth checking before a batch. Takes no parameters.
Editing
An assistant edits a video the way a person does in the editor, pays the same credits, and renders once at the end. Edits never re-render on their own: a finished video that has been edited reports unrendered_changes: true until render_video. Slow edits and renders queue and run in order, and get_video_status waits for them. Images, animations, voiceovers and portraits an edit replaces stay in the video's History in the OriginShorts app, where you can switch back.
| Tool | What it does | Credits |
|---|---|---|
get_video | The script, settings, characters, and every scene with its narration, image prompt, image, duration, effects and animation. render_blockers lists anything to fix before rendering. | Free |
view_video | The images themselves, so the assistant can see them (and show you): a numbered sheet of every scene with the character portraits, or one scene or character up close. | Free |
update_scenes | Change narration or image prompts, add, delete or move scenes. Immediate. Each scene's narration is at most 500 characters, and a video has at most 30 scenes. Any change to the narration (including adding, deleting or moving a scene) needs change_voice before rendering. | Free |
regenerate_scene_image | A new image for one scene, from a new prompt or the current one, optionally naming which characters appear in it. An animated scene loses its animation (it animated the old image). | 2 basic, 5 pro (3 on an older video unless a quality is given) |
change_voice | Re-records the narration and captions, in a new voice or the current one, with optional direction (tone, accent, emotion) for voices that support it. Needed after narration edits. | 10–40, by voice (60 for a retired premium voice) |
change_music | Swaps the background track (list_music), or removes it. | Free |
animate_scene | Turns a scene's still image into a video clip, from its animation prompt or a new one. | 3 or 12 per second of the scene |
remove_animation | Back to the still image with its Ken Burns move. | Free |
set_scene_effects | Ken Burns camera moves and overlay textures, per scene or all scenes. | Free |
change_captions | Caption style, font, position, entrance, uppercase, bold and colours. | Free |
add_character | Adds a character with a reference portrait, to any video. Put them in the scenes you choose with regenerate_scene_image (characters). | 2 basic, 5 pro |
update_character | Rename (free), turn a character off or back on (free), or give them a new look, which redraws their portrait. | Free; new look 2 basic, 5 pro |
remove_character | Deletes a character you added (scenes already drawn with them keep them until each image is redone); one found in the script is turned off instead, as in the app. | Free |
update_character_scenes | Redraws the scenes still showing a character's old look. | The image price per scene |
rename_video | A new title (and download filename). No render needed. | Free |
list_music | The music catalog, by genre. | Free |
render_video | Makes the new MP4 with every change, after any queued edits. | Free |
Posting
An assistant can post a finished video to the user's YouTube, TikTok and Instagram, now or at a set time, as the app does: public unless it sets the YouTube or TikTok privacy (Instagram posts are always public), with the titles and captions written for the video unless it writes its own. Connecting an account takes a link the user opens and approves; they don't need to sign in to OriginShorts.
| Tool | What it does | Credits |
|---|---|---|
list_social_accounts | The connected accounts (one per platform), and which platforms aren't connected yet. | Free |
connect_social_account | A link for the user: they sign in to the platform, approve, and the account is connected. | Free |
disconnect_social_account | Disconnects one, for example to connect a different account. A scheduled post goes to whichever account is connected for that platform when it posts, or skips it. | Free |
post_video | Posts now or at schedule_at, with per-platform title, caption, tags and (YouTube, TikTok) privacy. Renders first if needed. A video posts once. | Free |
cancel_post | Cancels a scheduled post before it goes out. | Free |
Allowed values
The authoritative list is whatever get_video_options returns. These are the fixed enums.
| Field | Values |
|---|---|
duration_range | 15-30 15-45 30-45 30-60 45-60 45-75 60-90 |
art_style | photorealistic comic-book anime 3d-animation film-noir |
image_quality | basic pro |
background_music | auto none, or a track id from list_music |
| status | queued processing ready_to_render rendering completed failed |
ready_to_render: no current MP4 (a video made in the OriginShorts app, or after a voice change). render_video makes it. |
Credits
| Item | Credits |
|---|---|
| Standard video | 100 |
| Pro image quality | +30 |
Premium voice (premium: true in list_voices) | +30 |
Animated (animated: true) | +3 basic / +12 pro per estimated second of animation (see create_video) |
| Edits | As in the app (see Editing); each reply says what it cost |
| Render | Free |
| Failed generation | Refunded automatically |
Plans are on the pricing page.
Errors
Failures return readable text rather than a bare code, so an agent can usually recover without help.
| Error | Meaning | What to do |
|---|---|---|
invalid_api_key | The key was rejected. | Check it, or make a new one on your account page. |
insufficient_credits | Balance is below the cost. | The message carries what was needed and what you have. Top up on the pricing page. |
invalid_request | A parameter was wrong or missing. | Call get_video_options for the valid values. |
idempotency_conflict | An identical create from moments ago is still being set up. | Wait ~10 seconds and call list_videos; don't create again. |
not_found | No video with that id on this account. | Check the id from create_video. |
video_busy · video_rendering · edits_in_progress | The video is still generating, rendering, or running queued edits. | get_video_status waits for it; then try again. |
not_ready | Something must be fixed before a render. | The message lists it (for example, re-record the voice). |
video_failed | The video's generation failed (its credits were refunded), so it can't be edited, rendered or posted. | Make a new video. A failed render is different: render_video tries again. |
not_editable | A skit or blank-canvas project. | Edit it in the OriginShorts app. |
already_posted · not_connected · reconnect_needed | Posting can't go ahead. | The message says why: connect or reconnect the account, or post a different video. |
voice_not_allowed or HTTP 403 | The voice needs a paid plan. | Free accounts can use the voices with requires_plan false. |
| HTTP 429 | A rate limit (per key: 10 new videos and 120 edits an hour, 300 reads a minute), 3 videos already generating, or 20 edits queued on one video. | The message says which: wait for a video or its edits to finish, or for the limit to reset. |