OriginShorts MCP Server
Connect Claude, ChatGPT, Cursor or any MCP client to OriginShorts and make 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
- To start
- 100 free credits, enough for one video
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 Desktop / Cursor
{
"mcpServers": {
"originshorts": {
"type": "http",
"url": "https://originshorts.com/mcp",
"headers": {
"Authorization": "Bearer os_live_YOUR_KEY"
}
}
}
}ChatGPT
Settings → Connectors → add a custom connector pointing at https://originshorts.com/mcp, then approve the OAuth screen. No key required.
Workflow
Generation is asynchronous. One call starts it, then you poll. A render takes roughly two to six minutes.
- Create
Call create_video with a topic (we write the script) or a script of your own. It returns a video id straight away.
- Poll
Call get_video_status every 15-30 seconds. Status moves queued → processing → rendering → completed.
- 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 a render fails, the status becomes failed and the credits are refunded automatically. No action needed on your side.
Tools
Six tools. Every response is JSON; 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.
| Parameter | Type | Notes |
|---|---|---|
topic | string | Idea to write the script from. Max 1200 characters. one of topic | script |
script | string | Your narration, used verbatim. Max 5000 words. one of topic | script |
duration_range | enum | Target length in seconds. required |
voice | string | Voice id from list_voices. Free accounts use kokoro voices. |
art_style | enum | Visual treatment for the generated images. |
image_quality | enum | basic or pro. Pro adds 30 credits. |
style | string | Content style preset id from get_video_options. |
background_music | enum | auto (default) matches music to the script; none leaves it silent. |
get_video_statusread onlyPolls one video by id. Returns its status and, once complete, the download URL.
| Parameter | Type | Notes |
|---|---|---|
video_id | string | Id returned by create_video. required |
list_videosread onlyThe account's 25 most recent videos, newest first.
| Parameter | Type | Notes |
|---|---|---|
cursor | string | next_cursor from the previous page. |
list_voicesread onlyEvery narration voice with its language, gender and premium surcharge. Takes no parameters.
get_video_optionsread onlyEvery valid value for create_video: style presets, art styles, caption styles, duration ranges, music tracks 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.
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 |
| status | queued processing rendering completed failed |
Credits
| Item | Credits |
|---|---|
| Standard video | 100 |
| Pro image quality | +30 |
| Premium voice | +30 |
| Failed render | Refunded automatically |
New accounts include 100 credits, enough for one standard video. 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 | A create with this key is still in flight. | Poll the existing video instead of retrying. |
not_found | No video with that id on this account. | Check the id from create_video. |
| HTTP 403 | The feature needs a paid plan. | Some voices and options are plan-gated. |
| HTTP 429 | Rate limited. | Wait 60 seconds before the next call. |