DocsDevelopers
MCP server
Use loudscene from Claude, Cursor and other MCP clients.
loudscene runs a remote MCP server, so AI agents can extract brands, write videos and render MP4s for you. It uses your workspace API key and spends credits exactly as the API does. Like the API, it is part of the Agency plan.
Connection#
| Setting | Value |
|---|---|
| URL | https://www.loudscene.com/api/mcp |
| Transport | Streamable HTTP, stateless, JSON responses (POST only) |
| Header | Authorization: Bearer ls_live_… |
| Rate limit | 120 requests every 60 s per key, shared with the API |
Create the key in Settings → API keys; see Authentication.
Setup#
Claude Code
One command registers the server with your key as a header:
claude mcp add --transport http loudscene https://www.loudscene.com/api/mcp \
--header "Authorization: Bearer $LOUDSCENE_API_KEY"Cursor
Add it to ~/.cursor/mcp.json, or .cursor/mcp.json in a project:
{
"mcpServers": {
"loudscene": {
"url": "https://www.loudscene.com/api/mcp",
"headers": { "Authorization": "Bearer ls_live_…" }
}
}
}Claude Desktop
Claude Desktop starts local servers over stdio, so it uses the CLI's bridge. Open Settings → Developer → Edit Config and add to claude_desktop_config.json:
{
"mcpServers": {
"loudscene": {
"command": "npx",
"args": ["-y", "loudscene", "mcp"],
"env": { "LOUDSCENE_API_KEY": "ls_live_…" }
}
}
}loudscene mcp reads one JSON-RPC message per line on stdin, forwards it to /api/mcp with your key and writes each answer as one line on stdout. It needs Node 20 or newer.
Other clients
Any client that can send a custom header to a remote Streamable HTTP server works with the settings above. Check the connection with curl:
curl -s https://www.loudscene.com/api/mcp \
-H "Authorization: Bearer $LOUDSCENE_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Tools (10)#
A typical run: list_brand_kits (or extract_brand, then wait_for_job) → create_video with a brief → wait_for_job → get_video → render_video with the formats you need → wait_for_render for the MP4 URLs.
extract_brandExtract a brand from a website
Reads a public website and saves its brand (colours, fonts, logo, tone) as a new brand kit in the workspace. Starts an asynchronous job and returns it: call wait_for_job with the job id; when it succeeds, result.brand_kit_id is the new kit to pass to create_video. Usually takes 20-60 seconds. Fails if the plan's brand kit limit is reached.
urlrequired · The brand's website, e.g. https://example.com (https is added when missing).idempotency_key· Optional. Any unique string (a UUID works). Retrying the call with the same key and the same arguments returns the first result instead of starting (and paying for) the work again.
list_brand_kitsList brand kits
Lists the workspace's brand kits (default first) with their colours and fonts. Use an id as brand_kit_id in create_video.
list_storiesList story templates
Lists the built-in stories (video templates such as product launch, feature drop, stat sequence) with their editable fields and default values. Pass a story id as story_id to create_video: with fields the video is built instantly without AI; without fields the AI writes it in that story's structure.
create_videoCreate an on-brand video
Creates a video on the workspace's brand. Two modes, exactly as the API: 1) AI generation: give a brief (and optionally story_id, duration_sec). The video starts in status "generating"; the answer includes the generation job: call wait_for_job with it (typically 1-3 minutes, call again if it is still running), then get_video. 2) Instant: give story_id plus fields (values for that story's field keys, see list_stories) and a brand kit. The video is ready immediately. Brand: brand_kit_id, or url (the brand is read from that site during generation), or neither to use the default kit. Credits: an AI generation (a brief, or a story without fields) counts against the plan's monthly generations, exactly as in the app; past that quota one credit buys 4 more generations and is taken automatically. Building a story with fields uses no AI and costs nothing. Rendering MP4s is a separate step (render_video).
brand_kit_id· Brand kit to use (from list_brand_kits). Omit it and url to use the workspace's default kit.url· A website to take the brand from when there is no brand kit yet. Ignored when brand_kit_id is given.brief· What the video should say: the news, offer or message, in plain words. Moderated before generation.story_id· A story id from list_stories. Omit it to let the AI pick the structure.fields· Field values for the story, keyed by the story's field keys (see list_stories): text, number, colour (#rrggbb), toggle, image ({url}) or list values. Needs story_id and a brand kit; with fields the video is built instantly, without AI.format· Main format: 16:9, 9:16, 1:1 or 4:5 (default 16:9). Every format can be rendered later with render_video.duration_sec· Target length in seconds (6 to 90). Default: the story's length, or 20.locale· Language of the on-screen text, e.g. en, de, pt-BR. Default en.title· Title shown in the video library.idempotency_key· Optional. Any unique string (a UUID works). Retrying the call with the same key and the same arguments returns the first result instead of starting (and paying for) the work again.
get_jobGet a job
Status, stage, progress (0-1) and result of an asynchronous job (brand extraction or video generation). Prefer wait_for_job, which waits server-side instead of polling.
job_idrequired · The job id (a UUID).
wait_for_jobWait for a job
Waits server-side (up to timeout_sec, at most 25 s) until a job succeeds, fails or is canceled, then returns it like get_job. If it is still running when the time is up, call wait_for_job again; do not poll in a tight loop.
job_idrequired · The job id (a UUID).timeout_sec· How long to wait, in seconds (1 to 25, default 20).
get_videoGet a video
A video's status, title, scenes (id, label, duration, fields) and field values of its current version, the running generation job if any, and editor_url (the player and editor in the Loudscene app, where share links are made).
video_idrequired · The video id (a UUID).include_doc· Also return the full VideoDoc (composition code included, often 20-200 KB). Default false.
render_videoRender MP4s
Renders the video's current version as MP4 in one or more formats (16:9, 9:16, 1:1, 4:5) and returns one render per format. Renders take about a minute each: call wait_for_render (or get_render) with each render id to get the download URL. An identical finished render is returned instead of rendering again.
video_idrequired · The video id (a UUID).formatsrequired · Formats to render: any of 16:9, 9:16, 1:1, 4:5.resolution· Short side in pixels: 720, 1080 (default) or 2160 (4K, Agency plan).idempotency_key· Optional. Any unique string (a UUID works). Retrying the call with the same key and the same arguments returns the first result instead of starting (and paying for) the work again.
get_renderGet a render
A render's status and progress (0-1); once succeeded, url is the MP4 download URL and poster_url a still image.
render_idrequired · The render id (a UUID).
wait_for_renderWait for a render
Waits server-side (up to timeout_sec, at most 25 s) until a render succeeds or fails, then returns it like get_render, with the MP4 URL when ready. If it is still running, call it again.
render_idrequired · The render id (a UUID).timeout_sec· How long to wait, in seconds (1 to 25, default 20).
Credits and waiting#
create_videowith a brief (or a story without fields) is an AI generation: it counts against your plan's monthly generations, and past them one credit buys more, as in the app. A story withfieldsis built instantly, without AI, at no cost.render_videospends credits like the API: the first render of a version costs one credit per started minute and covers every format and resolution of that version. Rendering an unchanged version again costs nothing.- Pass an
idempotency_keyto tools that start work, so a retried call returns the first result instead of paying twice. wait_for_jobandwait_for_renderwait on the server for up to 25 seconds per call. Call them again while work is still running instead of polling in a loop.- Tool failures (bad arguments, no credits, plan limits) come back as tool results with a message the model can act on. See Credits and plans.